package javaCode.chapter07.poly_.detail_;

public class PolyDetail {
    public static void main(String[] args) {

        //向上转型：父类的引用指向了子类的对象
        //语法：父类类型  引用名 = new 子类类型();
        Animal animal = new Cat();
        Object obj = new Cat(); // 可以 Object 也是 Cat的父类

        //向上转型的规则如下：
        //1、可以调用父类中的所有成员(需要遵守访问权限)
        //2、但是不能调用子类的特有的成员
        //3、因为在编译阶段，能调用哪些成员，是由编译类型来决定的
        //animal.catchMouse(); 错误

        //4、最终运行效果看子类的具体实现，调用方法时，先看运行类型，从运行类型开始查找，如果有就调用，没有一直延申到父类
        animal.eat(); //子类找到，且可以调用
        animal.run(); //父类找到，且可以调用
        animal.show();  //父类找到，且可以调用
        animal.sleep(); //父类找到，且可以调用

        //希望可以调用Cat的 catchMouse方法
        //多态的向下转型
        //1、语法：子类类型  引用名 = (子类类型)  父类类型;
        //问一个问题？ cat的编译类型是 Cat，运行类型是 Cat
        Cat cat = (Cat) animal;
        cat.catchMouse(); //猫抓老鼠
        //2、要求父类的引用必须是指向的当时目标的类型的对象
        //Dog dog = (Dog) animal; // 错误，和当前类型不一样

    }
}
